import { getToken, setToken, removeToken } from '@/utils/auth'
import { login, getInfo } from '@/api/login'
// 定义路由数据 用于动态加载
const app = {
  // state vuex的基本数据，用来存储变量
  state: {
    token: getToken(),
    roles: []
  },
  // mutations 提交更新数据的方法，必须是同步的(如果需要异步使用action)。每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。
  mutations: {
    SET_TOKEN: (state, token) => {
      state.token = token
    },
    SET_ROLES: (state, roles) => {
      state.roles = roles
    }
  },
  // actions 和mutation的功能大致相同，不同之处在于 ==》1. Action 提交的是 mutation，而不是直接变更状态。 2. Action 可以包含任意异步操作。
  actions: {
    Login ({ commit }, userInfo) {
      return new Promise((resolve, reject) => {
        login({ 'userName': userInfo.userName, 'passWord': userInfo.passWord }).then(res => {
          setToken(res.data.token)
          commit('SET_TOKEN', res.data.token)
          setUserInfo(res.data, commit)
          resolve()
        }).catch(error => {
          reject(error)
        })
      })
    },
    // 获取用户信息
    GetInfo ({ commit }) {
      return new Promise((resolve, reject) => {
        getInfo().then(res => {
          setUserInfo(res.data, commit)
          resolve(res)
        }).catch(error => {
          reject(error)
        })
      })
    },
    LogOut ({ commit }) {
      return new Promise((resolve, reject) => {
        removeToken()
        commit('SET_TOKEN', [])
        resolve()
      })
    }
  }
}
// 设置当前用户得角色
export const setUserInfo = (res, commit) => {
  // 如果没有任何权限，则赋予一个默认的权限，避免请求死循环
  if (res.roles.length === 0) {
    commit('SET_ROLES', ['ROLE_SYSTEM_DEFAULT'])
  } else {
    commit('SET_ROLES', res.roles)
  }
}

export default app
